package day20.enumerate;

/**
 * 操作枚举示例
 * 演示枚举实现接口的用法
 */
public class OperationTest {
    /**
     * 程序入口点
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        double x = 10.0;
        double y = 5.0;
        
        System.out.println("=== 操作枚举测试 ===");
        System.out.println("x = " + x + ", y = " + y);
        System.out.println();
        
        // 遍历所有操作并执行
        for (Operation op : Operation.values()) {
            double result = op.apply(x, y);
            System.out.println(x + " " + op + " " + y + " = " + result);
        }
        
        // 测试特定操作
        System.out.println();
        System.out.println("特别测试:");
        System.out.println("加法: " + Operation.PLUS.apply(x, y));
        System.out.println("乘法: " + Operation.TIMES.apply(x, y));
        System.out.println("幂运算: " + Operation.EXP.apply(x, y));
    }
}

/**
 * 操作接口
 * 定义了操作应该具备的方法
 */
interface Operable {
    /**
     * 应用操作
     * @param x 第一个操作数
     * @param y 第二个操作数
     * @return 运算结果
     */
    double apply(double x, double y);
}

/**
 * 操作枚举
 * 实现Operable接口，展示枚举实现接口的用法
 */
enum Operation implements Operable {
    // 加法操作
    PLUS("+") {
        @Override
        public double apply(double x, double y) {
            return x + y;
        }
    },
    
    // 减法操作
    MINUS("-") {
        @Override
        public double apply(double x, double y) {
            return x - y;
        }
    },
    
    // 乘法操作
    TIMES("*") {
        @Override
        public double apply(double x, double y) {
            return x * y;
        }
    },
    
    // 除法操作
    DIVIDE("/") {
        @Override
        public double apply(double x, double y) {
            if (y == 0) {
                throw new ArithmeticException("除数不能为零");
            }
            return x / y;
        }
    },
    
    // 幂运算操作
    EXP("^") {
        @Override
        public double apply(double x, double y) {
            return Math.pow(x, y);
        }
    };
    
    // 操作符号
    private final String symbol;
    
    /**
     * 枚举构造函数
     * @param symbol 操作符号
     */
    private Operation(String symbol) {
        this.symbol = symbol;
    }
    
    /**
     * 重写toString方法，返回操作符号
     * @return 操作符号
     */
    @Override
    public String toString() {
        return symbol;
    }
}